home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 / Ham Radio 2000.iso / ham2000 / tcp_ip / tnos / tnos100s / buildctl.c < prev    next >
C/C++ Source or Header  |  1994-01-08  |  6KB  |  263 lines

  1. // make executable with the command:
  2. //        bcc -ms buildctl.c \borlandc\lib\wildargs.obj
  3.  
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <dir.h>
  7. #include <dos.h>
  8. #include <io.h>
  9. #define NULLFILE (FILE *) 0
  10. #define NULLCHAR (char *) 0
  11. #define    BM_READ        2
  12.  
  13. char *dirname = ".";
  14.  
  15.  
  16. /* a mailbox entry */
  17. struct let {
  18.     long    start;
  19.     long    size;
  20.     long    bid;
  21.     int    status;
  22. };
  23.  
  24.  
  25. /* Returns 1 if name is in the given area file, 0 otherwise */
  26. static int
  27. isarea(name)
  28. char *name;
  29. {
  30. char buf[100], *cp;
  31. FILE *fp;
  32.  
  33.     sprintf (buf, "%s/SPOOL/areas.sys", dirname);
  34.     if((fp = fopen(buf,"r")) == NULLFILE)
  35.         return 0;
  36.     while(fgets(buf,sizeof(buf),fp) != NULLCHAR)     {
  37.         /* The first word on each line is all that matters */
  38.         if(isalnum(buf[0]))     { // skip comments
  39.                 if((cp = strchr(buf,' ')) != NULLCHAR)
  40.                 *cp = '\0';
  41.                 /*There could still be a tab before the space ! -WG7J */
  42.             if((cp = strchr(buf,'\t')) != NULLCHAR)
  43.                 *cp = '\0';
  44.                 /*This could be a line with just the area name,
  45.                  *ie terminated with 'CR/LF' - WG7J
  46.                  */
  47.                 if((cp = strchr(buf,'\n')) != NULLCHAR)
  48.                 *cp = '\0';
  49.                 if(stricmp(name,buf) == 0) {    /* found it */
  50.                 fclose(fp);
  51.                 return 1;
  52.                 }
  53.             }
  54.         }
  55.     fclose(fp);
  56.     return 0;
  57. }
  58.  
  59.  
  60. void
  61. rebuild_one (str)
  62. char *str;
  63. {
  64. long msgid;
  65. char *cp;
  66. register FILE *fp, *cfp;
  67. int nextisBID, firstIDline, k;
  68. char buf[256], buf2[512];
  69. int public, status, lines;
  70. long last, start, size;
  71.  
  72.     cp = strrchr (str, '/');
  73.     if (!cp)
  74.         cp = strrchr (str, '\\');
  75.     if (!cp)    {
  76.         sprintf (buf2, "%s/SPOOL/MAIL", dirname);
  77.         sprintf (buf, "%s/CONTROL/%s", buf2, str);
  78.         cp = str;
  79.     } else    {
  80.         *cp++ = 0;            
  81.         strcpy (buf2, str);
  82.         sprintf (buf, "%s/CONTROL/%s", str, cp);
  83.     }
  84.     if (strstr (buf, ".TXT") || strstr (buf, ".txt"))
  85.         strcpy (&buf[strlen(buf) - 3], "ctl");
  86.     else
  87.         strcat (buf, ".ctl");
  88.     if((cfp = fopen(buf,"wb")) == NULLFILE)    {
  89.         printf ("Can't create control file '%s'\n", buf);
  90.         return;
  91.     }
  92.     sprintf (buf, "%s/%s", buf2, cp);
  93. #if 0
  94.     if (cp)        {
  95.         strcat (buf, "/");
  96.         strcat (buf, cp);
  97.     }
  98. #endif
  99.     if (!strstr (buf, ".TXT") && !strstr (buf, ".txt"))
  100.         strcat (buf, ".txt");
  101.     if ((fp = fopen (buf, "rt")) == NULLFILE)    {
  102.         printf ("Can't open file '%s'\n", buf);
  103.         return;
  104.     }
  105.     firstIDline = nextisBID = 0;
  106.     printf ("Building Control Files for: '%s'\n", buf);
  107.     cp = strstr(buf, ".");
  108.     *cp = 0;
  109.     public = isarea (buf);
  110.     start = last = 0;
  111.     lines = 0;
  112.     while(fgets(buf,sizeof(buf),fp) != NULLCHAR){
  113.         if (!strncmp(buf, "From ", 5))    {
  114.             size = last - start - lines; 
  115.             if (size)    {
  116.                 fwrite (&start, sizeof(long), 1, cfp);
  117.                 fwrite (&size, sizeof(long), 1, cfp);
  118.                 fwrite (&msgid, sizeof(long), 1, cfp);
  119.                 fwrite (&status, sizeof(int), 1, cfp);
  120.             }
  121.             lines = status = 0;
  122.             start = last;
  123.             firstIDline = 0;
  124.         }
  125.         lines++;
  126.  
  127.         /* don't think this next section is necessary. All
  128.            messages SHOULD have a MSGID line */
  129.         if (!firstIDline && nextisBID && (cp=strstr(buf,"AA")) != NULLCHAR) {
  130.             /*what follows is the message-number*/
  131.             msgid = atol(cp+2);
  132.             nextisBID = 0;
  133.             firstIDline = 1;
  134.             }
  135.  
  136. #if 0
  137.         if (!strncmp ("Message-Id: ", buf, 12))    {
  138.             long nerf;
  139.             cp = &buf[12];
  140.             if (*cp == '<')
  141.                 cp++;
  142.             nerf = atol(cp);
  143.             if (nerf)
  144.                 msgid = nerf;
  145.         }
  146. #endif
  147.         if (!strncmp ("Received: ", buf, 10))
  148.             nextisBID = 1;
  149.         if (!public && !strncmp ("Status: R", buf, 9))
  150.             status = BM_READ;
  151.         last = ftell (fp);
  152.     }
  153.     fclose(fp);
  154.     size = last - start - lines; 
  155.     fwrite (&start, sizeof(long), 1, cfp);
  156.     fwrite (&size, sizeof(long), 1, cfp);
  157.     fwrite (&msgid, sizeof(long), 1, cfp);
  158.     fwrite (&status, sizeof(int), 1, cfp);
  159.     fclose(cfp);
  160. }
  161.  
  162. int
  163. newertime (txt, ctl)
  164. struct ftime *txt, *ctl;
  165. {
  166. int retval = 1;        /* default to 'yep, it's newer */
  167. int same = 0;
  168.  
  169.     if ((txt->ft_year <= ctl->ft_year) && (txt->ft_month <= ctl->ft_month)
  170.         && (txt->ft_day <= ctl->ft_day) && (txt->ft_hour <= ctl->ft_hour))
  171.             retval = 0;
  172.     if ((txt->ft_year == ctl->ft_year) && (txt->ft_month == ctl->ft_month)
  173.         && (txt->ft_day == ctl->ft_day) && (txt->ft_hour == ctl->ft_hour))
  174.             same = 1;
  175.     if (same && (txt->ft_min > ctl->ft_min))    {
  176.         retval = 1;
  177.         same = 0;
  178.     }
  179.     if (same && (txt->ft_tsec > ctl->ft_tsec))
  180.         retval = 1;
  181.     return (retval);
  182. }
  183.  
  184.  
  185. void
  186. main (argc, argv)
  187. int argc;
  188. char *argv[];
  189. {
  190. int k = 1, doit, doall = 0;
  191. char buf[128], *cp;
  192. struct ffblk ff;
  193. FILE *fp;
  194. long size;
  195. struct ftime txt, ctl;
  196.  
  197.     if (argc == 1)
  198.         doall = 1;
  199.     if ((argc > 1) && ((argv[1][0] == '-') || (argv[1][0] == '/')))    {
  200.         switch (tolower (argv[1][1]))    {
  201.             case 'd':    if (argv[1][2])        {
  202.                         dirname = &argv[1][2];
  203.                         k = 2;
  204.                         if (argc == 2)
  205.                             doall = 1;
  206.                         break;
  207.                     }
  208.                     // else fall through
  209.             default:    printf ("usage: buildctl [-ddirname] [mailfile]\n");
  210.                     exit (0);
  211.         }
  212.     }
  213.     if (!doall)        {
  214.         for ( ; k < argc; k++)
  215.             rebuild_one (argv[k]);
  216.     } else    {
  217.         sprintf(buf,"%s/SPOOL/MAIL/*.txt", dirname);
  218.         if (findfirst(buf, &ff, 0) == 0) {
  219.             do {
  220.                 sprintf (buf, "%s/SPOOL/MAIL/%s", dirname, ff.ff_name);
  221.                 if ((fp = fopen (buf, "r")) == NULL)
  222.                     continue;
  223.                 getftime (fileno (fp), &txt);
  224.                 fseek(fp,0L,2);
  225.                 size = ftell(fp);
  226.                 fclose (fp);
  227.                 if (size == 0L)    {
  228.                     remove (buf);
  229.                     continue;
  230.                 }
  231.                 sprintf (buf, "%s/SPOOL/MAIL/CONTROL/%s", dirname, ff.ff_name);
  232.                 cp = &buf[strlen(buf) - 3];
  233.                 strcpy (cp, "ctl");
  234.                 doit = 1;
  235.                 fp = fopen (buf, "r");
  236.                 if (fp)        {
  237.                     getftime (fileno (fp), &ctl);
  238.                     fclose (fp);
  239.                     doit = newertime (&txt, &ctl);
  240.                 }
  241.                 if (doit)
  242.                     rebuild_one (ff.ff_name);
  243.             } while (findnext(&ff) == 0);
  244.         } else
  245.             printf ("Couldn't find any mail files...\nThis command (without the -d option) must be executed from your\nTNOS root directory\n");
  246.  
  247.         /* now we remove any ctl files that do not have coresponding txt files */
  248.         sprintf(buf,"%s/SPOOL/MAIL/CONTROL/*.ctl", dirname);
  249.         if (findfirst(buf, &ff, 0) == 0) {
  250.             do {
  251.                 sprintf (buf, "%s/SPOOL/MAIL/%s", dirname, ff.ff_name);
  252.                 cp = &buf[strlen(buf) - 3];
  253.                 strcpy (cp, "txt");
  254.                 if (access (buf, 0) != NULL)    {
  255.                     sprintf(buf,"%s/SPOOL/MAIL/CONTROL/%s", dirname, ff.ff_name);
  256.                     remove (buf);
  257.                 }
  258.             } while (findnext(&ff) == 0);
  259.         }
  260.  
  261.     }
  262. }
  263.